import { Context, Next } from 'koa';

/**
 * 认证中间件
 * 检查请求头中的 Bearer Token
 */
export const authenticate = async (ctx: Context, next: Next) => {
    const authHeader = ctx.headers.authorization;

    if (!authHeader || !authHeader.startsWith('Bearer ')) {
        ctx.status = 401; // Unauthorized
        ctx.body = { message: '认证失败：缺少或无效的 Bearer Token。' };
        return;
    }

    const token = authHeader.split(' ')[1];

    // 实际应用中，这里会进行更复杂的 Token 验证，例如：
    // 1. JWT 验证 (jwt.verify(token, secretKey))
    // 2. 数据库查询用户
    // 3. 检查 Token 是否过期或被吊销

    // 简单模拟：如果 Token 是 'mysecrettoken' 则认证通过
    if (token === 'mysecrettoken') {
        // 将认证后的用户信息存储到 ctx.state，供后续路由处理函数使用
        ctx.state.user = { id: 123, username: 'testuser', roles: ['admin'] };
        console.log(`用户 ${ctx.state.user.username} 认证成功。`);
        await next(); // 认证通过，继续执行下一个中间件或路由处理函数
    } else {
        ctx.status = 403; // Forbidden (Token 存在但无效)
        ctx.body = { message: '认证失败：Token 无效。' };
    }
};

/**
 * 授权中间件 (可选，用于检查用户角色或权限)
 * @param requiredRoles 需要的角色数组
 */
export const authorize = (requiredRoles: string[]) => {
    return async (ctx: Context, next: Next) => {
        const user = ctx.state.user; // 从认证中间件获取的用户信息

        if (!user || !user.roles) {
            ctx.status = 403; // Forbidden
            ctx.body = { message: '授权失败：用户未认证或角色信息缺失。' };
            return;
        }

        const hasPermission = requiredRoles.some(role => user.roles.includes(role));

        if (hasPermission) {
            await next(); // 授权通过，继续执行
        } else {
            ctx.status = 403; // Forbidden
            ctx.body = { message: '授权失败：您没有足够的权限。' };
        }
    };
};
